#include <Keypad.h>


#define LED1 13 // красный светодиод
#define LED2 12 // зеленый светодиод
#define RELAY 11 // реле на замок

#define NUM_KEYS 4 // количество знаков в коде

char key;
char myarraw[NUM_KEYS] = { '1', '5', '9', 'D',}; // массив с верным кодом
char button_pressed[NUM_KEYS]; //массив для хранения нажатых кнопок
int k = 0; // счетчик нажатий
int s = 0; // счетчик совпадений нажатых кнопок с верными
const byte ROWS = 4; // количество строк в матрице клавиатуры
const byte COLS = 4; // количество столбцов
char keys[ROWS][COLS] = { // таблица соответствия кнопок символам
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {5, 4, 3, 2}; // пины подключенных строк
byte colPins[COLS] = {9, 8, 7, 6}; // пины подключенных столбцов


Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); // создаем объект клавиатуры для работы с ней

void setup() {
  pinMode(LED1, OUTPUT); // красный светодиод
  pinMode(LED2, OUTPUT); // зеленый светодиод
  pinMode(RELAY, OUTPUT); // реле управления замком
  digitalWrite(RELAY, HIGH); // вход реле инверсный, поэтому его сразу включаем (?!)
  Serial.begin(9600);

}

void loop ()
{ key = keypad.getKey(); // спрашиваем у клавиатуры, есть нажатая кнопка?

  if ( key != NO_KEY ) // если она все-таки есть
  {
    Serial.println(key);
    button_pressed [k] = key; //сохраняем эту кнопочку в массиве
    k = k + 1; // запоминаем сколько уже кнопок нажали
    if (k == NUM_KEYS) // если нажали нужное количество кнопок
    { for ( uint8_t i = 0; i < NUM_KEYS; i++) // пройдемся по всему массиву
      {
        if (button_pressed[i] == myarraw[i]) // и проверим нажатые кнопки с верным кодом
        { s = s + 1; // плюсуем счетчик совпадений


        }

      }

      if (s == NUM_KEYS) //если у нас все кнопки совпали с кодом, то включаем реле
      {
        digitalWrite (RELAY, LOW); // включили реле
        digitalWrite (LED2, HIGH); // зажгли зеленый светик (пользователь ввел верный код)
        delay (5000); // ждем 5 секунд пока горит светик зеленый и включено реле
        digitalWrite (RELAY, HIGH); // гасим реле
        digitalWrite (LED2, LOW); // гасим светик


        k = 0; //сбрасываем счетчик нажатий нашей переменной
        s = 0; // сбрасываем счетчик совпадений нашей переменной
      } else { // если не все кнопки совпали с верным кодом
        digitalWrite (LED1, HIGH); // включаем красный светик (пользователь ввел неверный код)
        delay (5000); // ждем 5 секунд
        digitalWrite (LED1, LOW); // гасим красн светик
        k = 0; // обнуляем счетчики, чтобы начать все заново
        s = 0; //
      }
    }
  }
}
